import axios from 'axios'
import NProgress from 'nprogress'

// const install = (Vue, _OPTIONS = {}) => {
// const instance = axios.create(_OPTIONS || {})
// let loading
// //   let loadingInstance,
// //     showLoading = true

// function toShowLoading (o) {
//     loading = this.$loading({
//       lock: true,
//       text: 'Loading',
//       spinner: 'el-icon-loading',
//       background: 'rgba(0, 0, 0, 0.7)'
//     })
// }

// function tocloseLoading () {
//     loading.close()
// }

// instance.interceptors.request.use(
//     function (config) {
//       toShowLoading()
//       // change to toUpperCase
//       // 在发送请求之前做某事
//       config.method = config.method.toUpperCase()
//       // fixed method and data/params
//       // 'PUT', 'POST', 和 'PATCH'方法时不允许存在params会报错???
//       // 非'PUT', 'POST', 和 'PATCH'方法时，如果data不为空会请求两次
//       if (config.method === 'GET') {
//         config.params = { ...config.data }
//         config.data = undefined
//       }
//       return config
//     },
//     function (error) {
//       // 请求错误时做些事
//       tocloseLoading()
//       return Promise.reject(error)
//     }
// )

// // interceptors response添加响应拦截器
// instance.interceptors.response.use(
//     function (response) {
//       // 对响应数据做些事
//       const result = {
//         status: response.status,
//         data: ''
//       }
//       if (response.status === 200) {
//         result.data = response.data
//       }
//       tocloseLoading()
//       return result
//     },
//     function (error) {
//       // 请求错误时做些事
//       tocloseLoading()
//       return Promise.reject(error.response.data)
//     }
// )

// // mount $https to vue prototype
// Vue.prototype.$https = instance
// }
function requestHandle (params) {
  axios.interceptors.request.use(config => {
    NProgress.start()
    config.method = config.method.toUpperCase()
    return config
  }, error => {
    return Promise.reject(error)
  })
  axios.interceptors.response.use(response => response, error => Promise.resolve(error.response))

  return new Promise((resolve, reject) => {
    axios(params)
      .then(res => {
        if (res && (res.unauthorized || res.statusCode === 401)) {
          window.location.href = '/login'
        }
        if (res.status === 200 || res.status === 304) {
          if (res.type === 'application/x-msdownload') {
            redirectToIframe(res.request.responseURL)
          } else if (res.status === 200 && res.data.code === '0') {
            resolve(res.data)
          } else {
            alert(res.data.message)
          }
        }
        return {
          data: {
            code: -404,
            message: res.statusText,
            data: res.statusText
          }
        }
      }, err => reject(err))
  })
}
function queryString (url, query) {
  let str = []
  for (let key in query) {
    str.push(key + '=' + query[key])
  }
  let paramStr = str.join('&')
  return paramStr ? `${url}?${paramStr}` : url
}
function redirectToIframe (url) {
  let iframe = document.createElement('iframe')
  iframe.style.display = 'none'
  iframe.src = url
  iframe.onload = function () {
    document.body.removeChild(iframe)
  }
  document.body.appendChild(iframe)
}

export default {
  post: function (url, params) {
    return requestHandle({
      method: 'post',
      url: url,
      data: params
    })
  },
  get: function (url, params) {
    return requestHandle({
      method: 'get',
      url: queryString(url, params)
    })
  }
}
